﻿/**
 * \brief 回收线程定义
 * \file CRecycleThread.cc
 */

#include "CTcpTask.h"
#include "CRecycleThread.h"
#include "Log.h"
#include "CTaskPoolThreadType.h"

CRecycleThread::CRecycleThread(CTcpTaskPool* _pool, int _eventSize, std::string _threadName)
	: CTcpThread(_pool, _eventSize), CThread(_threadName)
{}

CRecycleThread::~CRecycleThread() {}


/**
 * \brief 线程回调函数
 */
void CRecycleThread::run()
{
	_task_list_iter iter, next;

	while(this->isEnd())
	{
		/// 等待队列进入任务列表
		this->shift();

		if(!this->_M_list.empty())
		{
			for(iter = this->_M_list.begin(), next = iter; iter != this->_M_list.end();)
			{
				++next;
				CTcpTask* pTask = *iter;

				/// 任务是否可以被回收
				if(pTask->vCanRecycle())
				{
					/// 上层回收动作
					pTask->vRecycle();
					/// 列表中删除
					this->remove(iter);
					delete pTask;
				}

				/// 迭代器后移
				if(next != this->_M_list.end())
				{
					iter = next++;
				}
				else
				{
					/// 循环结束
					break;
				}
			}
		}

		/// 线程sleep200毫秒，让出CPU给其它线程
		this->msleep(200);
	}
}

/**
 * \brief 加入任务列表
 * \param _pTask：任务指针
 */
void CRecycleThread::add(CTcpTask* _pTask)
{
	this->_M_list.push_back(_pTask);
}

/**
 * \brief 从任务列表删除
 * \param _iter：指向任务的迭代器
 */
void CRecycleThread::remove(_task_list_iter& _iter)
{
	if(_iter != this->_M_list.end())
	{
		this->_M_list.erase(iter);
	}
}


